DroidKaigi 2019: マルチモジュールなプロジェクトでテストはどう変わる?
Speaker: Nozomi Takuma @ DeNA, SWET
multimodule
機能単位で module として分割した設計
why
差分ビルドによる時間短縮
App bundle, instant app
テスト
変わらないこと
書くこと
書き方
ライブラリとか
変わること
DI
方針
メトリクス収集
DI
モジュール感の依存関係をクリーンにしたい
モジュール依存の循環参照 (app -> feature -> app みたいな) が発生しないようにする
e.g. Dagger で feature 内の Activity に inject しようとする時 app の Application クラスに依存してしまう
dagger-android-support を使う
依存の定義をモジュール内で完結させたい
Dagger の Module 作成とか
方針
ビルド時間短縮と意味によるまとまりの分割、変更の影響範囲の縮小
動作確認もモジュール単位で完結させたい
毎回 apk ビルドしなくて良い
モジュール単位で確認が済んでいると結合時に考慮することが減る
Monolithic -> Multi-module
責務による分割
レイヤ毎 (domain, data, etc) の確認 + モジュールの責務の確認
モジュールのテスト: ほぼこれまで通り
Logic -> Logic -> Android Platform (SDK)
極力 Logic はユニットテストでカバーしておきたい
SDK との結合度合いではそこを mocking できない
結合を解けないところはまとめてITテストで期待動作を記述して、解きほぐしながらユニットテストに切り替える?
UI -> Logic -> SDK
Logic をユニット or IT, UIをUIテストみたいな感じでテストを分けるか、↑と同じようにまず全部UIテストで書くか
Project Nitrogen
実行環境にかかわらず同様のAPIで同じテストを記述できるようにする
この辺のはなし?
テストの共有はまだできないので、やりたいときは自作の srcDir を作る workaround をする
モジュールをまたいだテスト: やっぱりそんなに変わらない (テストダブルを活用できていれば)
テストダブルを活用する
他モジュールの依存を外から与えられるようにしておく
DIPのはなしっぽい?
メトリクス収集
JUnit のレポートとか Jacoco とか
全部のモジュールの結果をまとめて見せたい場合はレポートのマージが必要
JVM言語向け mutation testing library
Line coverage と Mutation coverage が見られる
マージの方法は repo を見る